| mata_atlantica ¶

1.1 | Importando pacotes usados ¶

In [ ]:
import numpy as np
import pandas as pd
import plotly.express as px
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
In [ ]:
import plotly.io as pio
pio.renderers
Out[ ]:
Renderers configuration
-----------------------
    Default renderer: 'plotly_mimetype+notebook'
    Available renderers:
        ['plotly_mimetype', 'jupyterlab', 'nteract', 'vscode',
         'notebook', 'notebook_connected', 'kaggle', 'azure', 'colab',
         'cocalc', 'databricks', 'json', 'png', 'jpeg', 'jpg', 'svg',
         'pdf', 'browser', 'firefox', 'chrome', 'chromium', 'iframe',
         'iframe_connected', 'sphinx_gallery', 'sphinx_gallery_png']
In [ ]:
pio.renderers.default = "notebook"

1.2 | Funções usadas ¶

In [ ]:
def equivalencia_linha(tabulacao_cruzada):
    """Essa função determina as esquivalências por linha entre dois mapas de uso e cobertura da terra (UTC).
        Recebe como entrada uma matriz de tablução cruzada entre os dois mapas.
    """
    
    mapeamento_linha = []
    for index, row in tabulacao_cruzada.iterrows():
        max_row = row.sort_values(ascending=False)
        mapeamento_linha.append(tabulacao_cruzada.loc[: , max_row.index[0]])
    
    mapeamento_linha = pd.DataFrame(data=mapeamento_linha)
    
    linhas = mapeamento_linha.index.tolist()
    colunas = mapeamento_linha.columns.tolist()
    data_tuples = list(zip(colunas, linhas))
    mapeamento_linha = pd.DataFrame(data_tuples, columns=['Quarto_Inventario','MapBiomas'])
    
    for i in range(len(mapeamento_linha)):
        mapeamento_linha.loc[i, "Size"] = tabulacao_cruzada.loc[(mapeamento_linha["Quarto_Inventario"][i])].max()
        
    return mapeamento_linha
In [ ]:
def equivalencia_coluna(tabulacao_cruzada):
    """Essa função determina as esquivalências por coluna entre dois mapas de uso e cobertura da terra (UTC).
        Recebe como entrada uma matriz de tablução cruzada entre os dois mapas.
    """
    
    mapeamento_coluna = []
    for column in range(0, tabulacao_cruzada.shape[1]):
        max_column = tabulacao_cruzada.iloc[:, column].sort_values(ascending=False)
        mapeamento_coluna.append(tabulacao_cruzada.loc[max_column.index[0], :])
    
    mapeamento_coluna = pd.DataFrame(data=mapeamento_coluna)
    
    linhas = mapeamento_coluna.index.tolist()
    colunas = mapeamento_coluna.columns.tolist()
    data_tuples = list(zip(colunas, linhas))
    mapeamento_coluna = pd.DataFrame(data_tuples, columns=['MapBiomas', 'Quarto_Inventario'])
    
    mapeamento_coluna.loc[:, ("Size")] = 0
    
    for i in range(len(mapeamento_coluna)):
         mapeamento_coluna.loc[i, "Size"] = tabulacao_cruzada.loc[:, (mapeamento_coluna["MapBiomas"][i])].max()
        
    return mapeamento_coluna
In [ ]:
def legenda_harmonizada(mapeamento_linha, mapeamento_coluna):
    """
        Determina a harmonização das legendas a partir das harmonizações por linha e por coluna.
    """
    
    legenda = pd.merge(equivalencias_linha, equivalencias_coluna, how="outer")
    
    return legenda
In [ ]:
def nodify(node_names):
    '''
        Cria os nódulos para agrupar cada legendas em uma coluna a partir da legenda gerada
        pela função harmonizacao_2_sankey e geras as cores de cada nódulo por coluna.
    '''
    # uniqe name endings
    ends = sorted(list(set([e[-1] for e in node_names])))
    
    # intervals
    steps = 0

    # x-values for each unique name ending
    # for input as node position
    nodes_x = {}
    node_colors = {}
    xVal = 0
    for e in ends:
        if e != " ":
            nodes_x[str(e)] = xVal
            xVal += steps + 0.3
        else:
            nodes_x[str(e)] = xVal
            xVal += steps
            
    for e in ends:
        if e != "'":
            node_colors[str(e)] = '#84caa0'
        else:
            node_colors[str(e)] = '#37986a'

    # x and y values in list form
    x_values = [nodes_x[n[-1]] for n in node_names]
    y_values = [0.01]*len(x_values)
    
    node_colors = [node_colors[n[-1]] for n in node_names]
    
    return x_values, y_values, node_colors
In [ ]:
def df_2_sankey(df,cols,values,hover_value=None):
    """ 
        Helper function to convert a dataframe of relationships to 
        Plotly Sankey format.
    """
    colors = ['#D0EDA6','#EDEF7B','#EF7B84','#00308f','#eedc82','#c66']
    out = df.copy()
    entities = dict()
    vals_ = [values,hover_value]
    try: 
        vals_.remove(None)
    except:
        pass
    
    # get dict of uid for each entity in each level from 0...n
    for n,c in enumerate(cols):
        if n == 0:
            out[f'{c}_'] = pd.factorize(out[c])[0]
        else:
            out[f'{c}_'] = pd.factorize(out[c])[0] + (out[f'{cols[n-1]}_'].max()+1)
        entities[n] = dict(out[[cols[n]+'_',cols[n]]].values)

    # create df edge list between source,targets
    edge_list = list()
    for i in range(0, len(cols), 1):
        slice_ = cols[i:i+2]
        if len(slice_)==2:
            el_ = out.groupby([f'{c}_' for c in slice_],as_index=False)[vals_].sum()
            el_.columns = ['source','target']+vals_
            edge_list.append(el_)
    edge_list = pd.concat(edge_list,ignore_index=True)

    # Sankey node definitions are simply the ordered uid/names of each entity 
    labels = [v[i] for k,v in entities.items() for i in v] # use v[i] for name, i for uid
    node_colors = [colors[k] for k in entities.keys() for i in entities[k]]

    # Sankey edge definitions
    source = list(edge_list['source'])
    target = list(edge_list['target'])
    values = list(edge_list[values])
    
    if hover_value is None:
        hover_values = list()
    else:
        hover_values = list(edge_list[hover_value])
    if len(source) == len(target) == len(values):
        return edge_list,entities,labels,node_colors,source,target,values,hover_values
    else:
        raise Exception('Output test fail: lists are of unequal lengths')
In [ ]:
def harmonizacao_2_sankey(df):
    """
    Gera os outputs necessários para gerar o diagrama de Sankey via plotly para a legenda harmonizada.
    """      
    equivalencias_linha = equivalencia_linha(df)
    _df = pd.DataFrame()
    _df["source"] = equivalencias_linha["Quarto_Inventario"] + "!"
    _df["target"] = equivalencias_linha["MapBiomas"] + "'"
    _df["value"] = equivalencias_linha["Size"]
    
    equivalencias_coluna = equivalencia_coluna(df)
    _df2 = pd.DataFrame()
    _df2["source"] = equivalencias_coluna["MapBiomas"] + "'"
    _df2["target"] = equivalencias_coluna["Quarto_Inventario"].astype(str) + " "
    _df2["value"] = equivalencias_coluna["Size"]
    
    _df = pd.concat([_df, _df2], ignore_index=True)
    
    legendas = pd.concat([_df['source'], _df['target']])
    legendas = legendas.unique()
    legenda = {x: index for index, x in enumerate(legendas)}
    
    nodified_x, nodified_y, node_colors = nodify(legendas)
    
    source = []
    target = []
    value = []
    for linha in _df.iterrows():
        source.append(legenda.get(linha[1].source))
        target.append(legenda.get(linha[1].target))
        value.append(linha[1].value)
    
    return legendas, source, target, value, node_colors, nodified_x, nodified_y

1.3 | Legendas dos mapas de acordo com os valores de pixel ¶

In [ ]:
mapbiomas_col7_legenda = {
    1 : "Floresta",
    3 : "Formação Florestal",
    4 : "Formação Savânica",
    5 : "Mangue",
    49 : "Restinga Arborizada",
    10 : "Formação Natural não Florestal",
    11 : "Campo Alagado e Área Pantanosa",
    12 : "Formação Campestre",
    32 : "Apicum",
    29 : "Afloramento Rochoso",
    50 : "Restinga Herbácea",
    13 : "Outras Formações não Florestais",
    14 : "Agropecuária",
    15 : "Pastagem",
    18 : "Agricultura",
    19 : "Lavoura Temporária",
    39 : "Soja",
    20 : "Cana",
    40 : "Arroz (beta)",
    62 : "Algodão (beta)",
    41 : "Outras Lavouras Temporárias",
    36 : "Lavoura Perene",
    46 : "Café",
    47 : "Citrus",
    48 : "Outras Lavouras Perenes",
    9 : "Silvicultura",
    21 : "Mosaico de Usos",
    22 : "Área não Vegetada",
    23 : "Praia, Duna e Areal",
    24 : "Área Urbanizada",
    30 : "Mineração",
    25 : "Outras Áreas não Vegetadas",
    26 : "Corpo D'água",
    33 : "Rio, Lago e Oceano",
    31 : "Aquicultura",
    27 : "Não Observado"
}

quarto_inventario_legenda = {
    1 : "Floresta manejada (FM)",
    2 : "Floresta não manejada (FNM)",
    3 : "Floresta secundária (FSec)",
    4 : "Corte seletivo (CS)",
    5 : "Reflorestamento (Ref)",
    6 : "Campo manejado (GM)",
    7 : "Campo não manejado (GNM)",
    8 : "Campo secundário (GSec)",
    9 : "Pastagem (Ap)",
    10 : "Pastagem degradada (APD)",
    11 : "Outras formações lenhosas manejadas (OFLM)",
    12 : "Outras formações lenhosas não manejadas (OFLNM)",
    13 : "Outras formações lenhosas secundárias (OFLSec)",
    14 : "Agricultura anual  (AC)",
    15 : "Agricultura perene (PER)",
    16 : "Agricultura semiperene  (CANA)",
    17 : "Água (A)",
    18 : "Reservatório (Res)",
    19 : "Assentamento (S)",
    20 : "Dunas manejadas (DnM)",
    21 : "Dunas não manejadas (DnNM)",
    22 : "Afloramento rochoso manejado (ArM)",
    23 : "Afloramento rochoso não manejado (ArNM)",
    24 : "Mineração (Min)",
    25 : "Solo exposto (SE)",
    26 : "Áreas não observadas (NO)"
}

1.4 | Carregando os dados ¶

In [ ]:
df = pd.read_csv("../confusion_matrix/tab_cruz_mata_atlantica.csv", index_col="Unnamed: 0")

df.head()
Out[ ]:
0.0 3.0 4.0 5.0 9.0 11.0 12.0 13.0 15.0 20.0 ... 39.0 40.0 41.0 46.0 47.0 48.0 49.0 50.0 62.0 255.0
0.0 3617434630 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 2166385522
1.0 0 51984059 473283 550262 274268 2589120 132518 11203 891218 19158 ... 69524 134 324559 85161 6451 2818 2295872 229626 0 12772
2.0 0 215001322 17332503 1463708 5722577 6012079 2088208 36246 12652585 428910 ... 3971244 14028 2095462 1137122 14612 9313 3625678 819875 0 197732
3.0 0 4924689 1140970 1207 464453 354173 147436 3365 1150465 25954 ... 148995 1793 215977 65800 3043 711 104670 16440 0 8735
5.0 0 15048173 558793 1184 38185602 242503 775344 13158 1906725 46056 ... 418991 2480 503721 251082 6551 3179 113212 2371 0 55266

5 rows × 29 columns

1.5 | Tratando os dados ¶

In [ ]:
df.shape
Out[ ]:
(25, 29)
In [ ]:
df.index
Out[ ]:
Index([ 0.0,  1.0,  2.0,  3.0,  5.0,  6.0,  7.0,  8.0,  9.0, 11.0, 12.0, 13.0,
       14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0,
       26.0],
      dtype='float64')
In [ ]:
df.columns
Out[ ]:
Index(['0.0', '3.0', '4.0', '5.0', '9.0', '11.0', '12.0', '13.0', '15.0',
       '20.0', '21.0', '23.0', '24.0', '25.0', '29.0', '30.0', '31.0', '32.0',
       '33.0', '39.0', '40.0', '41.0', '46.0', '47.0', '48.0', '49.0', '50.0',
       '62.0', '255.0'],
      dtype='object')
In [ ]:
df = df.drop(index=0.0, columns=["0.0", "255.0"])


df.head()
Out[ ]:
3.0 4.0 5.0 9.0 11.0 12.0 13.0 15.0 20.0 21.0 ... 33.0 39.0 40.0 41.0 46.0 47.0 48.0 49.0 50.0 62.0
1.0 51984059 473283 550262 274268 2589120 132518 11203 891218 19158 4019897 ... 193152 69524 134 324559 85161 6451 2818 2295872 229626 0
2.0 215001322 17332503 1463708 5722577 6012079 2088208 36246 12652585 428910 41313425 ... 1000978 3971244 14028 2095462 1137122 14612 9313 3625678 819875 0
3.0 4924689 1140970 1207 464453 354173 147436 3365 1150465 25954 3115905 ... 33899 148995 1793 215977 65800 3043 711 104670 16440 0
5.0 15048173 558793 1184 38185602 242503 775344 13158 1906725 46056 5883121 ... 46229 418991 2480 503721 251082 6551 3179 113212 2371 0
6.0 1168844 173823 622 16555 432863 1155427 115 87519 133 157024 ... 3895 41060 8 12071 321 138 18 275 386 0

5 rows × 27 columns

1.6 | Mapeando os nomes das classes ¶

In [ ]:
classes_mapa1 = df.columns.astype(float)
classes_mapa2 = df.index

# Mapeando os valores de pixels com os nomes das classes
mapa1_legenda = list(map(mapbiomas_col7_legenda.get, classes_mapa1))
mapa2_legenda = list(map(quarto_inventario_legenda.get, classes_mapa2))
In [ ]:
mapa1_legenda
Out[ ]:
['Formação Florestal',
 'Formação Savânica',
 'Mangue',
 'Silvicultura',
 'Campo Alagado e Área Pantanosa',
 'Formação Campestre',
 'Outras Formações não Florestais',
 'Pastagem',
 'Cana',
 'Mosaico de Usos',
 'Praia, Duna e Areal',
 'Área Urbanizada',
 'Outras Áreas não Vegetadas',
 'Afloramento Rochoso',
 'Mineração',
 'Aquicultura',
 'Apicum',
 'Rio, Lago e Oceano',
 'Soja',
 'Arroz (beta)',
 'Outras Lavouras Temporárias',
 'Café',
 'Citrus',
 'Outras Lavouras Perenes',
 'Restinga Arborizada',
 'Restinga Herbácea',
 'Algodão (beta)']
In [ ]:
mapa2_legenda
Out[ ]:
['Floresta manejada (FM)',
 'Floresta não manejada (FNM)',
 'Floresta secundária (FSec)',
 'Reflorestamento (Ref)',
 'Campo manejado (GM)',
 'Campo não manejado (GNM)',
 'Campo secundário (GSec)',
 'Pastagem (Ap)',
 'Outras formações lenhosas manejadas (OFLM)',
 'Outras formações lenhosas não manejadas (OFLNM)',
 'Outras formações lenhosas secundárias (OFLSec)',
 'Agricultura anual  (AC)',
 'Agricultura perene (PER)',
 'Agricultura semiperene  (CANA)',
 'Água (A)',
 'Reservatório (Res)',
 'Assentamento (S)',
 'Dunas manejadas (DnM)',
 'Dunas não manejadas (DnNM)',
 'Afloramento rochoso manejado (ArM)',
 'Afloramento rochoso não manejado (ArNM)',
 'Mineração (Min)',
 'Solo exposto (SE)',
 'Áreas não observadas (NO)']
In [ ]:
# Renomeando linhas e colunas de acordo com as classes 
df.columns = mapa1_legenda
df.index = mapa2_legenda

df.head()
Out[ ]:
Formação Florestal Formação Savânica Mangue Silvicultura Campo Alagado e Área Pantanosa Formação Campestre Outras Formações não Florestais Pastagem Cana Mosaico de Usos ... Rio, Lago e Oceano Soja Arroz (beta) Outras Lavouras Temporárias Café Citrus Outras Lavouras Perenes Restinga Arborizada Restinga Herbácea Algodão (beta)
Floresta manejada (FM) 51984059 473283 550262 274268 2589120 132518 11203 891218 19158 4019897 ... 193152 69524 134 324559 85161 6451 2818 2295872 229626 0
Floresta não manejada (FNM) 215001322 17332503 1463708 5722577 6012079 2088208 36246 12652585 428910 41313425 ... 1000978 3971244 14028 2095462 1137122 14612 9313 3625678 819875 0
Floresta secundária (FSec) 4924689 1140970 1207 464453 354173 147436 3365 1150465 25954 3115905 ... 33899 148995 1793 215977 65800 3043 711 104670 16440 0
Reflorestamento (Ref) 15048173 558793 1184 38185602 242503 775344 13158 1906725 46056 5883121 ... 46229 418991 2480 503721 251082 6551 3179 113212 2371 0
Campo manejado (GM) 1168844 173823 622 16555 432863 1155427 115 87519 133 157024 ... 3895 41060 8 12071 321 138 18 275 386 0

5 rows × 27 columns

Convertendo os valores de pixel para milhões de hectares.

In [ ]:
df2 = df

df = round(df * 0.09 / 1000000, 2)

df.head()
Out[ ]:
Formação Florestal Formação Savânica Mangue Silvicultura Campo Alagado e Área Pantanosa Formação Campestre Outras Formações não Florestais Pastagem Cana Mosaico de Usos ... Rio, Lago e Oceano Soja Arroz (beta) Outras Lavouras Temporárias Café Citrus Outras Lavouras Perenes Restinga Arborizada Restinga Herbácea Algodão (beta)
Floresta manejada (FM) 4.68 0.04 0.05 0.02 0.23 0.01 0.0 0.08 0.00 0.36 ... 0.02 0.01 0.0 0.03 0.01 0.0 0.0 0.21 0.02 0.0
Floresta não manejada (FNM) 19.35 1.56 0.13 0.52 0.54 0.19 0.0 1.14 0.04 3.72 ... 0.09 0.36 0.0 0.19 0.10 0.0 0.0 0.33 0.07 0.0
Floresta secundária (FSec) 0.44 0.10 0.00 0.04 0.03 0.01 0.0 0.10 0.00 0.28 ... 0.00 0.01 0.0 0.02 0.01 0.0 0.0 0.01 0.00 0.0
Reflorestamento (Ref) 1.35 0.05 0.00 3.44 0.02 0.07 0.0 0.17 0.00 0.53 ... 0.00 0.04 0.0 0.05 0.02 0.0 0.0 0.01 0.00 0.0
Campo manejado (GM) 0.11 0.02 0.00 0.00 0.04 0.10 0.0 0.01 0.00 0.01 ... 0.00 0.00 0.0 0.00 0.00 0.0 0.0 0.00 0.00 0.0

5 rows × 27 columns

2.1 | Análise dos dados ¶

2.1.1 | Tabulação Cruzada ¶

In [ ]:
results = []
for p_key, values in df.items():
    for key, value in values.items():
        results.append({"source": p_key, "target": key, "value": value})
        # print(p_key, key, value)

df_list = pd.DataFrame(results, columns=['target', 'source', 'value'])
df_list
Out[ ]:
target source value
0 Floresta manejada (FM) Formação Florestal 4.68
1 Floresta não manejada (FNM) Formação Florestal 19.35
2 Floresta secundária (FSec) Formação Florestal 0.44
3 Reflorestamento (Ref) Formação Florestal 1.35
4 Campo manejado (GM) Formação Florestal 0.11
... ... ... ...
643 Afloramento rochoso manejado (ArM) Algodão (beta) 0.00
644 Afloramento rochoso não manejado (ArNM) Algodão (beta) 0.00
645 Mineração (Min) Algodão (beta) 0.00
646 Solo exposto (SE) Algodão (beta) 0.00
647 Áreas não observadas (NO) Algodão (beta) 0.00

648 rows × 3 columns

In [ ]:
fig = px.imshow(df.replace(0, None), text_auto=True, aspect="auto", height=1000, title='Matriz de Tabulação Cruzada entre os mapas (Mha)')
fig.show()
In [ ]:
fig = make_subplots(
    rows=2, cols=1,
    shared_yaxes='all',
    specs=[[{"type": "xy"}],[{"type": "xy"}]],
    subplot_titles=("<b>MapBiomas Col. 7 - mata_atlantica<b>", "<b>Quarto Inventário Nacional - mata_atlantica<b>")
)

fig.add_trace(go.Bar(y= df.sum(), x=df.sum().index, text=((df.sum())).astype(int).astype(str)+"Mha"),
              row=1, col=1)

fig.add_trace(go.Bar(y = df.sum(axis='columns').sort_values(ascending=False), 
                     x=df.sum(axis='columns').sort_values(ascending=False).index, 
                     text=((df.sum(axis='columns').sort_values(ascending=False))).astype(int).astype(str)+"Mha"),
              row=2, col=1)

fig.update_layout(title_text="<b>Distribuição das Classes por Mapa da Região Estudada<b>",
                  height=1000,
                  width=1200,
                  showlegend=False
                  )

fig.update_layout(barmode='stack', xaxis={'categoryorder':'total descending'})

fig.show()

2.2 | Equivalências por linha ¶

In [ ]:
equivalencias_linha = equivalencia_linha(df)
display(equivalencias_linha)
Quarto_Inventario MapBiomas Size
0 Floresta manejada (FM) Formação Florestal 4.68
1 Floresta não manejada (FNM) Formação Florestal 19.35
2 Floresta secundária (FSec) Formação Florestal 0.44
3 Reflorestamento (Ref) Silvicultura 3.44
4 Campo manejado (GM) Formação Florestal 0.11
5 Campo não manejado (GNM) Formação Campestre 1.19
6 Campo secundário (GSec) Formação Florestal 0.01
7 Pastagem (Ap) Pastagem 29.87
8 Outras formações lenhosas manejadas (OFLM) Formação Florestal 0.07
9 Outras formações lenhosas não manejadas (OFLNM) Formação Florestal 0.09
10 Outras formações lenhosas secundárias (OFLSec) Mosaico de Usos 0.01
11 Agricultura anual (AC) Soja 11.75
12 Agricultura perene (PER) Mosaico de Usos 0.48
13 Agricultura semiperene (CANA) Cana 4.89
14 Água (A) Rio, Lago e Oceano 0.53
15 Reservatório (Res) Rio, Lago e Oceano 1.38
16 Assentamento (S) Área Urbanizada 1.70
17 Dunas manejadas (DnM) Formação Florestal 0.00
18 Dunas não manejadas (DnNM) Praia, Duna e Areal 0.04
19 Afloramento rochoso manejado (ArM) Formação Florestal 0.00
20 Afloramento rochoso não manejado (ArNM) Formação Florestal 0.01
21 Mineração (Min) Mineração 0.03
22 Solo exposto (SE) Formação Florestal 0.00
23 Áreas não observadas (NO) Formação Florestal 0.00
In [ ]:
edge_list,entities,labels,colors,source,target,values,hover_values = df_2_sankey(equivalencias_linha,['MapBiomas', 'Quarto_Inventario'],values='Size')

fig = go.Figure(data=[go.Sankey(
    valueformat = ".0f",
    node = dict(
      pad = 5,
      thickness = 20,
      line = dict(color = "black", width = 0.5),
      label = labels,
      color = colors,
      customdata=hover_values,
      hovertemplate='Source: %{label}<br />'+
                    'Amount: %{value}<br />'
    ),
    link = dict(
      source = source, # indices correspond to labels, eg A1, A2, A2, B1, ...
      target = target,
      value = values,
      customdata=hover_values,
      hovertemplate='Source: %{source.label}<br />'+
                    'Target: %{target.label}<br />'+
                    'Amount: %{value}<br />', 
  ))])

fig.update_layout(autosize=True,width=900,height=1200,title_text="<b> Quarto_Inventario > MapBiomas | mata_atlantica<b>", font_size=12)
fig.show()

2.3 | Equivalências por coluna ¶

In [ ]:
equivalencias_coluna = equivalencia_coluna(df)
display(equivalencias_coluna)
MapBiomas Quarto_Inventario Size
0 Formação Florestal Floresta não manejada (FNM) 19.35
1 Formação Savânica Floresta não manejada (FNM) 1.56
2 Mangue Floresta não manejada (FNM) 0.13
3 Silvicultura Reflorestamento (Ref) 3.44
4 Campo Alagado e Área Pantanosa Pastagem (Ap) 0.55
5 Formação Campestre Campo não manejado (GNM) 1.19
6 Outras Formações não Florestais Pastagem (Ap) 0.01
7 Pastagem Pastagem (Ap) 29.87
8 Cana Agricultura semiperene (CANA) 4.89
9 Mosaico de Usos Pastagem (Ap) 9.17
10 Praia, Duna e Areal Dunas não manejadas (DnNM) 0.04
11 Área Urbanizada Assentamento (S) 1.70
12 Outras Áreas não Vegetadas Pastagem (Ap) 0.07
13 Afloramento Rochoso Floresta não manejada (FNM) 0.18
14 Mineração Mineração (Min) 0.03
15 Aquicultura Reservatório (Res) 0.01
16 Apicum Floresta não manejada (FNM) 0.01
17 Rio, Lago e Oceano Reservatório (Res) 1.38
18 Soja Agricultura anual (AC) 11.75
19 Arroz (beta) Agricultura anual (AC) 0.17
20 Outras Lavouras Temporárias Agricultura anual (AC) 1.25
21 Café Agricultura perene (PER) 0.47
22 Citrus Agricultura perene (PER) 0.07
23 Outras Lavouras Perenes Floresta manejada (FM) 0.00
24 Restinga Arborizada Floresta não manejada (FNM) 0.33
25 Restinga Herbácea Pastagem (Ap) 0.07
26 Algodão (beta) Floresta manejada (FM) 0.00
In [ ]:
edge_list,entities,labels,colors,source,target,values,hover_values = df_2_sankey(equivalencias_coluna,['MapBiomas', 'Quarto_Inventario'],values='Size')

fig = go.Figure(data=[go.Sankey(
    valueformat = ".0f",
    node = dict(
      pad = 5,
      thickness = 20,
      line = dict(color = "black", width = 0.5),
      label = labels,
      color = colors,
      customdata=hover_values,
      hovertemplate='Source: %{label}<br />'+
                    'Amount: %{value}<br />'
    ),
    link = dict(
      source = source, # indices correspond to labels, eg A1, A2, A2, B1, ...
      target = target,
      value = values,
      customdata=hover_values,
      hovertemplate='Source: %{source.label}<br />'+
                    'Target: %{target.label}<br />'+
                    'Amount: %{value}<br />', 
  ))])

fig.update_layout(autosize=True,width=900,height=1200,title_text="<b> MapBiomas > Quarto_Inventario | mata_atlantica<b>", font_size=12)
fig.show()

2.4 | Legenda Harmonizada ¶

In [ ]:
mapeamento = legenda_harmonizada(equivalencias_linha, equivalencias_coluna)
display(mapeamento)
Quarto_Inventario MapBiomas Size
0 Floresta manejada (FM) Formação Florestal 4.68
1 Floresta não manejada (FNM) Formação Florestal 19.35
2 Floresta secundária (FSec) Formação Florestal 0.44
3 Reflorestamento (Ref) Silvicultura 3.44
4 Campo manejado (GM) Formação Florestal 0.11
5 Campo não manejado (GNM) Formação Campestre 1.19
6 Campo secundário (GSec) Formação Florestal 0.01
7 Pastagem (Ap) Pastagem 29.87
8 Outras formações lenhosas manejadas (OFLM) Formação Florestal 0.07
9 Outras formações lenhosas não manejadas (OFLNM) Formação Florestal 0.09
10 Outras formações lenhosas secundárias (OFLSec) Mosaico de Usos 0.01
11 Agricultura anual (AC) Soja 11.75
12 Agricultura perene (PER) Mosaico de Usos 0.48
13 Agricultura semiperene (CANA) Cana 4.89
14 Água (A) Rio, Lago e Oceano 0.53
15 Reservatório (Res) Rio, Lago e Oceano 1.38
16 Assentamento (S) Área Urbanizada 1.70
17 Dunas manejadas (DnM) Formação Florestal 0.00
18 Dunas não manejadas (DnNM) Praia, Duna e Areal 0.04
19 Afloramento rochoso manejado (ArM) Formação Florestal 0.00
20 Afloramento rochoso não manejado (ArNM) Formação Florestal 0.01
21 Mineração (Min) Mineração 0.03
22 Solo exposto (SE) Formação Florestal 0.00
23 Áreas não observadas (NO) Formação Florestal 0.00
24 Floresta não manejada (FNM) Formação Savânica 1.56
25 Floresta não manejada (FNM) Mangue 0.13
26 Pastagem (Ap) Campo Alagado e Área Pantanosa 0.55
27 Pastagem (Ap) Outras Formações não Florestais 0.01
28 Pastagem (Ap) Mosaico de Usos 9.17
29 Pastagem (Ap) Outras Áreas não Vegetadas 0.07
30 Floresta não manejada (FNM) Afloramento Rochoso 0.18
31 Reservatório (Res) Aquicultura 0.01
32 Floresta não manejada (FNM) Apicum 0.01
33 Agricultura anual (AC) Arroz (beta) 0.17
34 Agricultura anual (AC) Outras Lavouras Temporárias 1.25
35 Agricultura perene (PER) Café 0.47
36 Agricultura perene (PER) Citrus 0.07
37 Floresta manejada (FM) Outras Lavouras Perenes 0.00
38 Floresta não manejada (FNM) Restinga Arborizada 0.33
39 Pastagem (Ap) Restinga Herbácea 0.07
40 Floresta manejada (FM) Algodão (beta) 0.00
In [ ]:
legendas, source, target, value, node_colors, nodified_x, nodified_y = harmonizacao_2_sankey(df2)

fig = go.Figure(data=[go.Sankey(
    arrangement='snap',
    node = dict(
        pad = 15,
        thickness = 20,
        line = dict(color = "black", width = 0.5),
        label = legendas,
        color = node_colors,
        x=nodified_x,
        y=nodified_y
    ),
    link = dict(
      source = source, # indices correspond to labels, eg A1, A2, A1, B1, ...
      target = target,
      value = value
  ))])


fig.update_layout(autosize=True,width=1000,height=1500,title_text="<b> Inventário > MapBiomas > Inventário | mata_atlantica <b>", font_size=12)
fig.show()

Aqui temos uma versão do diagrama sem considerar a quantidade de área identificada. Ele possibilita uma visão mais limpa de como ficaram as concordâncias.

In [ ]:
legendas, source, target, value, node_colors, nodified_x, nodified_y = harmonizacao_2_sankey(df)

value = [1] * len(value)

fig = go.Figure(data=[go.Sankey(
    arrangement='snap',
    node = dict(
        pad = 15,
        thickness = 20,
        line = dict(color = "black", width = 0.5),
        label = legendas,
        color = node_colors,
        x=nodified_x,
        y=nodified_y
    ),
    link = dict(
      source = source, # indices correspond to labels, eg A1, A2, A1, B1, ...
      target = target,
      value = value
  ))])

fig.update_layout(autosize=True,width=1000,height=1500,title_text="<b> Quarto Inventário > MapBiomas | mata_atlantica <b>", font_size=12)
fig.show()

2.5 | Análise das Informações Obtidas ¶

In [ ]:
concordancia_geral = round(100 * mapeamento.loc[:, "Size"].sum() / df.to_numpy().sum(), 2)

print("A concordância geral entre os mapas foi de {}%".format(concordancia_geral), "considerando a harmonização obtida.")
A concordância geral entre os mapas foi de 77.89% considerando a harmonização obtida.